#pragma once
#include<iostream>
#include<unordered_map>
#include<fstream>
#include<string>
#include"LOG.hpp"

namespace dict_ns
{
    const std::string default_path = "./Dict.txt";
    const std::string sep = ": ";
    class Dict
    {
    private:
        //加载字典配置文件到内存
        bool Load()
        {
            std::ifstream in(_dictconf_filepath);
            if(!in.is_open())//打开失败
            {
                LOG(FATAL,"open %s error\n",_dictconf_filepath);
                return false;
            }
            std::string line;
            //循环的从文件中读一行到line中
            while(std::getline(in,line))
            {
                if(line.empty())//读取的是空行跳到下一行
                {
                    continue;//读到空行继续读
                }
                //非空行那么找分割符
                auto pos = line.find(sep);
                if(pos == std::string::npos)//找不到跳到下一行
                {
                    continue;
                }
                //提出此行单词
                std::string word = line.substr(0,pos);
                if(word.empty())//单词为空跳到下一行
                {
                    continue;
                }
                //非空提取汉字
                //apple: 苹果
                //pos位置跳过": "就是汉字起始位置，substr不提供后一个参数会一直提取到字符串末尾
                std::string han = line.substr(pos+sep.size());
                if(han.empty()) continue;//没有对应的汉字翻译跳到下一行
                LOG(DEBUG,"load info,&s: %s\n",word.c_str(),han.c_str());
                //插入_dict对象中
                _dict.insert(std::make_pair(word,han));
            }
            in.close();
            LOG(DEBUG,"Load %s Success",_dictconf_filepath.c_str());
            return true;
        }
    public:
        //构造
        Dict(const std::string &path = default_path)
        :_dictconf_filepath(path)
        {
            Load();
        }

        
        std::string Translate(const std::string &word,bool &ok)
        {
            ok = true;//判断配置文件中有没有对应的word
            auto iter = _dict.find(word);
            if(iter == _dict.end())
            {
                ok = false;
                return "未找到对应的单词";
            }
            //找到返回翻译(k对应的value)
            return iter->second;
        }

        //析构
        ~Dict()
        {}
    private:
        std::string _dictconf_filepath;//字典路径
        //字典
        std::unordered_map<std::string,std::string> _dict;
    };
}